package com.hp.attendance.util;

import com.hp.attendance.entity.dto.ExcelDTO;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.util.List;

public class ExcelUtil {

    public static <T> void exportExcel(List<T> list,List<ExcelDTO> listExcel, HttpServletResponse resp,String fileName) throws IOException, NoSuchFieldException, IllegalAccessException {
        //1.创建excel文档对象
        XSSFWorkbook sheets = new XSSFWorkbook();
        //2.创建工作表对象
        XSSFSheet sheet = sheets.createSheet();
        //3.加入表头数据
        XSSFRow row = sheet.createRow(0);
        for (int i = 0; i < listExcel.size(); i++) {
            ExcelDTO excelDTO = listExcel.get(i);
            row.createCell(i).setCellValue(excelDTO.getColumn_comment());
        }
        //4.加入数据
        for (int i = 0; i < list.size(); i++) {
            XSSFRow row1 = sheet.createRow(i + 1);
            //o 是我们需要添加的数据的对象
            T o = list.get(i);
            // 获取listExcel的长度 它有多长 就有多少个单元格
            for (int j = 0; j < listExcel.size(); j++) {
                //获取exceDTO对象 里面有字段名的数据(对象的属性名) 和字段注释的数据
                ExcelDTO excelDTO = listExcel.get(j);
                //获取字段名 也就是获取属性名
                //column_name = "employee_number"
                String column_name = excelDTO.getColumn_name();
                //反射  可以通过属性名 获取属性对象
                Field field = o.getClass().getDeclaredField(column_name);
                //暴力反射
                field.setAccessible(true);
                //获取employee_number属性的值
                Object value = field.get(o);
                row1.createCell(j).setCellValue(String.valueOf(value));
            }
        }

        //6.把excel文档以附件的形式下载
        //设置excel文件格式
        resp.setContentType("application/vnd.ms-excel");
        //设置文件以附件形式下载
        String filename =new String(fileName.getBytes(),"ISO-8859-1");
        resp.setHeader("Content-Disposition","attachment;filename="+filename);
        sheets.write(resp.getOutputStream());
    }
}
